package _03_recursion;

import org.junit.Test;

/**
 * @author: mornd
 * @dateTime: 2023/6/2 - 13:10
 * 杨辉三角
 *
 * [i][j] = [i-1][j] + [i-1][j-1]
 *
 * <p>
 * ①
 * ① ①
 * ① ② ①
 * ① ③ ③ ①
 * ① ④ ⑥ ④ ①
 */
public class PascalTriangleTest {
    @Test
    public void test() {
        System.out.println(getValue(5, 2));
    }

    // 控制台打印杨辉三角
    @Test
    public void test2() {
        print(10);
    }

    /**
     * 给出行号i和列j，求出该位置元素的值
     *
     * @param i
     * @param j
     * @return
     */
    int getValue(int i, int j) {
        if (j > i) {
            throw new IllegalArgumentException();
        }
        // 处理特殊情况 j==0 时，下标从0开始，或者 i=j 时值都等于1
        if (j == 0 || i == j) {
            return 1;
        }

        // 下标[i][j]的值 = [i-1][j] + [i-1][j-1]
        return getValue(i - 1, j - 1) + getValue(i - 1, j);
    }

    /**
     * 打印杨辉三角
     *
     * @param row 高度
     */
    void print(int row) {
        System.out.println("-------------------- 杨辉三角 --------------------");
        for (int i = 0; i < row; i++) {
            // 打印前置的空格
            for (int k = 0; k < row - i - 1; k++) {
                System.out.print("\t");
            }
            for (int j = 0; j < i + 1; j++) {
                System.out.print(getValue(i, j) + "\t\t");
            }
            System.out.println();
        }
    }
}
